package algorithm;

/**
 * 给定整数数组 nums 和整数 k，请返回数组中第 k 个最大的元素。
 * 请注意，你需要找的是数组排序后的第 k 个最大的元素，而不是第 k 个不同的元素。
 *
 * 重点是排序
 * 示例 1:
 * 输入: [3,2,1,5,6,4] 和 k = 2
 * 输出: 5
 *
 * 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
 * 输出: 4
 */
public class 数组中的第K大的数字 {

    public static void main(String[] args) {

        int[] nums = {1,4,3,3,5,6};

        quickSort(nums,0 , nums.length-1);


        System.out.println(findKthLargest(nums,3));
        for (int num : nums) {
            System.out.println(num);
        }
    }


    public static int findKthLargest(int[] nums, int k) {

        quickSort(nums,0 , nums.length-1);

        return nums[nums.length-k];
    }


    public static void quickSort(int[] nums, int lo, int hi ){

        if(hi <= lo){
            return;
        }

        int j = partition(nums,lo,hi);

        quickSort(nums,lo , j-1 );
        quickSort(nums,j +1 , hi );

    }

    public static int partition(int[] a, int lo, int hi) {
        int i = lo, j = hi + 1;
        int temp;
        int v = a[lo];
        while (true) {
            while (a[++i] < v) {
                if (i == hi) {
                    break;
                }
            }
            while (v < a[--j]) {
                if (j == lo) {
                    break;
                }
            }
            if (i >= j) {
                break;
            }
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
        temp = a[lo];
        a[lo] = a[j];
        a[j] = temp;
        return j;
    }
}
